package com.rengwuxian.coursecoroutines._4_flow

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.collectIndexed
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.withIndex
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlin.coroutines.EmptyCoroutineContext

/**
 * withIndex()操作符
 * withIndex()
 *
 * 给Flow里的每个元素编上序号，从0开始。返回值是IndexedValue<T>
 * 由于IndexedValue是一个data class，可以直接从函数声明里把它拆开来写，直接使用其中的两个属性。
 *
 * collectIndexed(): 它和withIndex()一样都是编序号的，它是用于最后一步收集的，而withIndex()是在中间过程里用于操作Flow的。
 * 输出：
 * 1: 0 - 1
 * 1: 1 - 2
 * 1: 2 - 3
 * 1: 3 - 4
 * 1: 4 - 5
 * 1: 0 - 1
 * 1: 1 - 2
 * 1: 2 - 3
 * 1: 3 - 4
 * 1: 4 - 5
 */
fun main() = runBlocking<Unit> {
  val scope = CoroutineScope(EmptyCoroutineContext)
  val flow1 = flowOf(1, 2, 3, 4, 5)
  scope.launch {
    flow1.withIndex().collect { (index, data) ->
      println("1: $index - $data")
    }
    flow1.collectIndexed { index, value ->
      println("1: $index - $value")
    }
  }
  delay(10000)
}